package string;

/**
 * Strring是不变对象，创建后内容不可改变，改变则创建新对象
 * 这是由于java对字符串的一个优化措施：常量池
 * java会将所有使用字面量形式创建的字符串对象缓存在常量池
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1="123abc";//字面量创建的字符串第一次使用时会缓存在常量池中
        String s2="123abc";//重用s1对象（重用对象池中的123abc）
        System.out.println("s1="+s1);
        System.out.println("s2="+s2);
        System.out.println(s1==s2);//s1,s2是引用类型变量，保存地址，相等说明指向同一个对象
        String s3="123abc";//一样重用
        System.out.println(s1==s3);
        String s4=new String("123abc");//new则一定创建新对象,不推荐
        System.out.println(s1==s4);

        s1=s1+"!";//字符串是不变对象，修改内容会创建新对象
        System.out.println("s1="+s1);//创建了新对象123abc！
        System.out.println("s2="+s2);
        System.out.println("s3="+s3);
        System.out.println(s1==s2);//不再指向同一个对象

        /*

         */

        String s5="123"+"abc";//触发了预计算特性
        System.out.println("s5="+s5);
        System.out.println(s5==s2);

        String s ="123";
        String s6=s+"abc";//这里编译器不做任何操作，因此JVM执行时拼接字符串产生新对象
        System.out.println("s6="+s6);
        System.out.println(s6==s2);//false ,没有重用常量池对象
    }


}
